﻿using System;
using System.ServiceModel;
using System.ComponentModel;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Common.Exceptions.FaultContracts;

namespace Sinacor.Servico.Bovespa.Movimento.Service.ServiceContract
{
    [ExceptionShielding]
    [ServiceContract(Namespace = "http://www.bovespa.com.br/Sinacor.Servico.Bovespa.Movimento.Service.ServiceContract", SessionMode = SessionMode.Allowed)]
    public interface IControleMovimentoBolsa
    {
        #region Membros

        /// <summary>
        /// Retorna a próxima data de movimento calculada para o sistema
        /// </summary>
        /// <returns>DataContract.Response.DataMovimentoResponse</returns>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "CalcularDataAberturaMovimento")]
        DataContract.Response.DataMovimentoResponse CalcularDataAberturaMovimento();

        /// <summary>
        /// Recupera informações como data do movimento, estado do movimento para o módulo de Bolsa
        /// </summary>
        /// <param name="request">DataContract.Request.DataMovimentoRequest</param>
        /// <returns>DataContract.Response.InformacoesMovimentoResponse</returns>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ObterInformacoesMovimento")]
        DataContract.Response.InformacoesMovimentoResponse ObterInformacoesMovimento(DataContract.Request.DataMovimentoRequest request);

        /// <summary>
        /// Remonta o calendario do modulo de Faturamento Bolsas
        /// </summary>
        [FaultContract(typeof(BusinessFault))]
        [FaultContract(typeof(ValidationFault))]
        [FaultContract(typeof(GeneralFault))]
        [FaultContract(typeof(InvalidSessionFault))]
        [FaultContract(typeof(LicensingFault))]
        [FaultContract(typeof(AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "RemontarCalendario")]
        void RemontarCalendario();

        #endregion
    }
}
